package com.hopu.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import com.hopu.properties.JwtProperties;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.Map;

@Component // 交给Spring管理，便于注入配置
public class JwtUtils {

    private final SecretKey SECRET_KEY;
    // 过期时间：6个月
    private static final long EXPIRATION_TIME = 6L * 30 * 24 * 60 * 60 * 1000;

    // 通过构造函数注入JwtProperties
    public JwtUtils(JwtProperties jwtProperties) {
        // 从配置文件获取密钥，并转换为SecretKey
        byte[] keyBytes = jwtProperties.getAdminSecretKey().getBytes();
        this.SECRET_KEY = Keys.hmacShaKeyFor(keyBytes); // 基于配置的密钥生成HS256所需的SecretKey
    }

    // 生成JWT
    public String generateJwt(Map<String, Object> claims) {
        return Jwts.builder()
                .setClaims(claims) // 自定义数据
                .setIssuedAt(new Date()) // 签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 过期时间
                .signWith(SECRET_KEY, SignatureAlgorithm.HS256) // 使用配置的密钥签名
                .compact();
    }

    // 解析JWT（返回Map）
    public Map<String, Object> parseJwt(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY) // 使用配置的密钥验证
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    // 解析JWT获取用户ID（统一使用parserBuilder）
    public Integer getUserIdFromJwt(String jwt) {
        Claims claims = Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY) // 使用配置的密钥验证
                .build()
                .parseClaimsJws(jwt)
                .getBody();
        // 注意：生成JWT时存入的key是"userid"，这里必须一致（建议用常量定义避免拼写错误）
        return claims.get("userid", Integer.class);
    }
}